#include "memory.h"

#include <stdlib.h>
#include <errno.h>

void *
sc_allocarray(size_t nmemb, size_t size) {
    size_t bytes;
    /**
     * GCC 和 Clang 编译器提供的内建函数（Built-in Functions）
     * __builtin_mul_overflow(a, b, res)：检查 a * b是否溢出，并将结果存储在 bytes 中
     */
    if (__builtin_mul_overflow(nmemb, size, &bytes)) {
      // ENOMEM 系统定义的错误-内存溢出
      errno = ENOMEM;
      return NULL;
    }
    return malloc(bytes);
}
